package cn.edu.sdjzu.knoverse.config;

import cn.edu.sdjzu.knoverse.constant.RedisGraphConstant;
import cn.edu.sdjzu.knoverse.constant.RedisUserConstant;
import cn.edu.sdjzu.knoverse.service.GraphQueryService;
import cn.edu.sdjzu.knoverse.service.OverviewService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * 定时任务配置类
 */
@Configuration
@EnableScheduling
@RequiredArgsConstructor
@Slf4j
public class ScheduledConfig {

    private final OverviewService overviewService;
    private final RedisTemplate<String, Object> redisTemplate;
    private final GraphQueryService graphQueryService;

    /**
     * 每隔25分钟刷新一次首页概览数据缓存
     * 这样可以保证缓存不会过期，同时减轻数据库查询压力
     */
    @Scheduled(fixedRate = 25 * 60 * 1000) // 25分钟执行一次
    public void refreshOverviewDataCache() {
        log.info("定时任务执行：刷新首页概览数据缓存");
        // 检查缓存是否存在
        Boolean hasKey = redisTemplate.hasKey(RedisUserConstant.HOME_OVERVIEW_DATA_KEY);
        
        // 如果即将过期或不存在，则更新缓存
        if (hasKey == null || !hasKey) {
            log.info("缓存不存在，重新加载数据");
            overviewService.getOverviewData(); // 触发数据查询并缓存
        } else {
            // 检查过期时间，如果剩余时间小于10分钟，则提前刷新
            Long ttl = redisTemplate.getExpire(RedisUserConstant.HOME_OVERVIEW_DATA_KEY);
            if (ttl != null && ttl < 10 * 60) {
                log.info("缓存即将过期（剩余{}秒），提前刷新", ttl);
                overviewService.getOverviewData(); // 触发数据查询并缓存
            } else {
                log.info("缓存有效期充足，无需刷新");
            }
        }
    }
    
    /**
     * 每隔45分钟刷新一次图数据缓存
     */
    @Scheduled(fixedRate = 45 * 60 * 1000) // 45分钟执行一次
    public void refreshGraphDataCache() {
        log.info("定时任务执行：刷新图数据缓存");
        // 检查缓存是否存在
        Boolean hasKey = redisTemplate.hasKey(RedisGraphConstant.ALL_NODES_RELATIONSHIPS_KEY);
        
        // 如果即将过期或不存在，则更新缓存
        if (hasKey == null || !hasKey) {
            log.info("图数据缓存不存在，重新加载数据");
            graphQueryService.getAllNodesAndRelationships(); // 触发数据查询并缓存
        } else {
            // 检查过期时间，如果剩余时间小于15分钟，则提前刷新
            Long ttl = redisTemplate.getExpire(RedisGraphConstant.ALL_NODES_RELATIONSHIPS_KEY);
            if (ttl != null && ttl < 15 * 60) {
                log.info("图数据缓存即将过期（剩余{}秒），提前刷新", ttl);
                graphQueryService.getAllNodesAndRelationships(); // 触发数据查询并缓存
            } else {
                log.info("图数据缓存有效期充足，无需刷新");
            }
        }
    }
} 